#include "LsdMain.h"
#include "flexible_button.h"
#include "main.h"
#include "LsdEEPROM.h"
#include "bsp.h"
#include "LsdEvent.h"
#include "LsdScreenTask.h"
#include "LsdKey.h"
#include "LsdDisplayTask.h"
#include "LsdBuzzer.h"
#include "LsdLed.h"
//#include "LsdFlash.h"

static flex_button_t user_button[USER_BUTTON_MAX];

static uint8_t common_btn_read(void *arg)
{
	uint8_t ret = 0;
	
	flex_button_t *btn = (flex_button_t *)arg;
	
	switch(btn->id)
	{
		case KEY_SUDA_WATER://苏打水按键
		{
			if(powerDownSave.cock_cnt == DEVICE_PRO)
			{
				ret = (HAL_GPIO_ReadPin(KEY_SODA_WATER_GPIO_Port,KEY_SODA_WATER_Pin) == 1)?0:1;
			}else
			{
				ret = 0;
			}
			break;
		}
		case KEY_COOL_WATER://冷水按键
		{
#if(QIANG_YING_DEVICE == 1)			
		if(powerDownSave.cock_cnt != DEVICE_HEAT)
		{
//			if(powerDownSave.cock_cnt == DEVICE_COOL_HEAT)
//			{
//				ret = (HAL_GPIO_ReadPin(KEY_SODA_WATER_GPIO_Port,KEY_SODA_WATER_Pin)==1)?0:1;//冷热使用的是苏打
//			}
//			else{
				ret = (HAL_GPIO_ReadPin(KEY_COOL_WATER_GPIO_Port,KEY_COOL_WATER_Pin)==1)?0:1;
//			}	
		}			
		else{
			ret = 0;
		}	
#else
			ret = (HAL_GPIO_ReadPin(SODA_LIGHT_CTRL_GPIO_Port,SODA_LIGHT_CTRL_Pin)==1)?0:1;
#endif			
			break;
		}
		case KEY_WARM_WATER://常温水按键
		{
			ret = (HAL_GPIO_ReadPin(KEY_WARM_WATER_GPIO_Port,KEY_WARM_WATER_Pin)== 1)?0:1;
			break;
		}
		case 	KEY_HOT_WATER://热水按键
		{	
			ret = (HAL_GPIO_ReadPin(KEY_HOT_WATER_GPIO_Port,KEY_HOT_WATER_Pin)== 1)?0:1;
			break;
		}
		case 	KEY_LOCK_WATER://童锁按键
		{	
#if(QIANG_YING_DEVICE == 1)		
			ret = (HAL_GPIO_ReadPin(KEY_LOCK_GPIO_Port,KEY_LOCK_Pin)== 1)?0:1;
#else 
			ret = 0;
#endif
			
			break;
		}
		case SW_HOT_EN://加热开关
		{	
			ret = (HAL_GPIO_ReadPin(SW_HEAT_GPIO_Port,SW_HEAT_Pin)== 1)?0:1;
			break;
		}
		case SW_COOL_EN://制冷开关
		{	
			ret = (HAL_GPIO_ReadPin(SW_COOL_GPIO_Port,SW_COOL_Pin)== 1)?0:1;
			break;
		}
		default:
			break;
	}
	
	return ret;
}


static void common_btn_evt_cb(void *arg)
{
	static uint8_t led_status[LED_TYPE_MAX] = {0};
  flex_button_t *btn = (flex_button_t *)arg;
	OnEventSendValue(EVENT_TASK_SCREEN_DATA,ACTION_SCREEN_KEY_VALUE,(uint32_t)btn);//地址传过去
//	if((btn->event == FLEX_BTN_PRESS_LONG_HOLD)	|| btn->event == FLEX_BTN_PRESS_LONG_HOLD_UP)
//	{
//		buzz_on(0);
		if(btn->event == FLEX_BTN_PRESS_DOWN)	//蜂鸣器1HZ工作单音
		{
			if((powerDownSave.touch_sound == 1) && (HAL_GetTickMs()>3500))
			OnEventSendValue(EVENT_TASK_BUZZER, MONO, 0);
		}
		switch(btn->id)
		{
			case KEY_SUDA_WATER://苏打水按键
			{
				switch(btn->event)
				{
					case  FLEX_BTN_PRESS_DOWN :// 按下事件
					{
						if(powerDownSave.work_mode == 1)//测试模式
						{
							if(led_status[LED_TYPE_SODA_LIGHT] == 0)
							{
								OnLedSetMode(LED_TYPE_SODA_LIGHT, 	LED_MODE_ON, 0);	//苏达
								led_status[LED_TYPE_SODA_LIGHT] = 1;
							}else{
								OnLedSetMode(LED_TYPE_SODA_LIGHT, 	LED_MODE_OFF, 0);	//苏达
								led_status[LED_TYPE_SODA_LIGHT] = 0;
							}
						}					
						break;
					}
					case	FLEX_BTN_PRESS_CLICK: // 单击事件
					break;  
					case	FLEX_BTN_PRESS_DOUBLE_CLICK: // 双击事件
					break; 
					case	FLEX_BTN_PRESS_REPEAT_CLICK:  // 连击事件，使用 flex_button_t 中的 click_cnt 断定连击次数
					break;
					case	FLEX_BTN_PRESS_SHORT_START: // 短按开始事件
					break; 
					case	FLEX_BTN_PRESS_SHORT_UP: // 短按抬起事件
					break; 
					case	FLEX_BTN_PRESS_LONG_START: // 长按开始事件
					break; 
					case	FLEX_BTN_PRESS_LONG_UP:// 长按抬起事件
					break; 
					case	FLEX_BTN_PRESS_LONG_HOLD: // 长按保持事件
					{
						print_debug("KEY_SUDA_WATER\r\n");
						break;
					}
					case	FLEX_BTN_PRESS_LONG_HOLD_UP:// 长按保持的抬起事件
					break; 
					default:break;
				}
				break;
			}
			case KEY_COOL_WATER://冷水按键
			{
				switch(btn->event)
				{
					case  FLEX_BTN_PRESS_DOWN :// 按下事件
					{
						if(powerDownSave.work_mode == 1)//测试模式
						{
							if(led_status[LED_TYPE_COOL_LIGHT] == 0)
							{
								OnLedSetMode(LED_TYPE_COOL_LIGHT, 	LED_MODE_ON, 0);	//苏达
								led_status[LED_TYPE_COOL_LIGHT] = 1;
							}else{
								OnLedSetMode(LED_TYPE_COOL_LIGHT, 	LED_MODE_OFF, 0);	//苏达
								led_status[LED_TYPE_COOL_LIGHT] = 0;
							}
						}	
						break;
					}
					case	FLEX_BTN_PRESS_CLICK: // 单击事件
					break;  
					case	FLEX_BTN_PRESS_DOUBLE_CLICK: // 双击事件
					break; 
					case	FLEX_BTN_PRESS_REPEAT_CLICK:  // 连击事件，使用 flex_button_t 中的 click_cnt 断定连击次数
					break;
					case	FLEX_BTN_PRESS_SHORT_START: // 短按开始事件
					break; 
					case	FLEX_BTN_PRESS_SHORT_UP: // 短按抬起事件
					break; 
					case	FLEX_BTN_PRESS_LONG_START: // 长按开始事件
					break; 
					case	FLEX_BTN_PRESS_LONG_UP:// 长按抬起事件
					break; 
					case	FLEX_BTN_PRESS_LONG_HOLD: // 长按保持事件
					{
						print_debug("KEY_COOL_WATER\r\n");
						break;
					}
					case	FLEX_BTN_PRESS_LONG_HOLD_UP:// 长按保持的抬起事件
					break; 
					default:break;
				}
				break;
			}
			case KEY_WARM_WATER://常温水按键
			{
				switch(btn->event)
				{
					case  FLEX_BTN_PRESS_DOWN :// 按下事件
					{
						if(powerDownSave.work_mode == 1)//测试模式
						{
							if(led_status[LED_TYPE_WARM_LIGHT] == 0)
							{
								OnLedSetMode(LED_TYPE_WARM_LIGHT, 	LED_MODE_ON, 0);	
								led_status[LED_TYPE_WARM_LIGHT] = 1;
							}else{
								OnLedSetMode(LED_TYPE_WARM_LIGHT, 	LED_MODE_OFF, 0);	
								led_status[LED_TYPE_WARM_LIGHT] = 0;
							}
						}	
						break;
						}
					case	FLEX_BTN_PRESS_CLICK: // 单击事件
					break;  
					case	FLEX_BTN_PRESS_DOUBLE_CLICK: // 双击事件
					break; 
					case	FLEX_BTN_PRESS_REPEAT_CLICK:  // 连击事件，使用 flex_button_t 中的 click_cnt 断定连击次数
					break;
					case	FLEX_BTN_PRESS_SHORT_START: // 短按开始事件
					break; 
					case	FLEX_BTN_PRESS_SHORT_UP: // 短按抬起事件
					break; 
					case	FLEX_BTN_PRESS_LONG_START: // 长按开始事件
					break; 
					case	FLEX_BTN_PRESS_LONG_UP:// 长按抬起事件
					break; 
					case	FLEX_BTN_PRESS_LONG_HOLD: // 长按保持事件
					{
						print_debug("KEY_WARM_WATER\r\n");
						break;
					}
					case	FLEX_BTN_PRESS_LONG_HOLD_UP:// 长按保持的抬起事件
					break; 
					default:break;
				}
				break;
			}
			case KEY_HOT_WATER://热水按键
			{
				switch(btn->event)
				{
					case  FLEX_BTN_PRESS_DOWN :// 按下事件
					{
						if(powerDownSave.work_mode == 1)//测试模式
						{
							if(led_status[LED_TYPE_HOT_LIGHT] == 0)
							{
								OnLedSetMode(LED_TYPE_HOT_LIGHT, 	LED_MODE_ON, 0);	
								OnLedSetMode(LED_TYPE_HOT_FLAG1, 	LED_MODE_ON, 0);	
								OnLedSetMode(LED_TYPE_HOT_FLAG2, 	LED_MODE_ON, 0);	
								OnLedSetMode(LED_TYPE_HOT_FLAG3, 	LED_MODE_ON, 0);	
								led_status[LED_TYPE_HOT_LIGHT] = 1;
							}else{
								OnLedSetMode(LED_TYPE_HOT_LIGHT, 	LED_MODE_OFF, 0);	
								OnLedSetMode(LED_TYPE_HOT_FLAG1, 	LED_MODE_OFF, 0);	
								OnLedSetMode(LED_TYPE_HOT_FLAG2, 	LED_MODE_OFF, 0);	
								OnLedSetMode(LED_TYPE_HOT_FLAG3, 	LED_MODE_OFF, 0);	
								led_status[LED_TYPE_HOT_LIGHT] = 0;
							}
						}	
						break;
					}
					case	FLEX_BTN_PRESS_CLICK: // 单击事件
					break;  
					case	FLEX_BTN_PRESS_DOUBLE_CLICK: // 双击事件
					break; 
					case	FLEX_BTN_PRESS_REPEAT_CLICK:  // 连击事件，使用 flex_button_t 中的 click_cnt 断定连击次数
					break;
					case	FLEX_BTN_PRESS_SHORT_START: // 短按开始事件
					break; 
					case	FLEX_BTN_PRESS_SHORT_UP: // 短按抬起事件
					break; 
					case	FLEX_BTN_PRESS_LONG_START: // 长按开始事件
					break; 
					case	FLEX_BTN_PRESS_LONG_UP:// 长按抬起事件
					break; 
					case	FLEX_BTN_PRESS_LONG_HOLD: // 长按保持事件
					{
						print_debug("KEY_HOT_WATER\r\n");
						break;
					}
					case	FLEX_BTN_PRESS_LONG_HOLD_UP:// 长按保持的抬起事件
					break; 
					default:break;
				}
				break;
			}
			case KEY_LOCK_WATER://童锁按键
			{
				switch(btn->event)
				{
					case  FLEX_BTN_PRESS_DOWN :// 按下事件
					{
						if(powerDownSave.work_mode == 1)//测试模式
						{
							if(led_status[LED_TYPE_LOCK_LIGHT] == 0)
							{
								OnLedSetMode(LED_TYPE_LOCK_LIGHT, 	LED_MODE_ON, 0);	
								OnLedSetMode(LED_TYPE_LOCK_FLAG1, 	LED_MODE_ON, 0);	
								OnLedSetMode(LED_TYPE_LOCK_FLAG2, 	LED_MODE_ON, 0);	
								OnLedSetMode(LED_TYPE_LOCK_FLAG3, 	LED_MODE_ON, 0);	
								led_status[LED_TYPE_LOCK_LIGHT] = 1;
							}else{
								OnLedSetMode(LED_TYPE_LOCK_LIGHT, 	LED_MODE_OFF, 0);	
								OnLedSetMode(LED_TYPE_LOCK_FLAG1, 	LED_MODE_OFF, 0);	
								OnLedSetMode(LED_TYPE_LOCK_FLAG2, 	LED_MODE_OFF, 0);	
								OnLedSetMode(LED_TYPE_LOCK_FLAG3, 	LED_MODE_OFF, 0);	
								led_status[LED_TYPE_LOCK_LIGHT] = 0;
							}
						}	
						break;
					}
					case	FLEX_BTN_PRESS_CLICK: // 单击事件
					break;  
					case	FLEX_BTN_PRESS_DOUBLE_CLICK: // 双击事件
					break; 
					case	FLEX_BTN_PRESS_REPEAT_CLICK:  // 连击事件，使用 flex_button_t 中的 click_cnt 断定连击次数
					break;
					case	FLEX_BTN_PRESS_SHORT_START: // 短按开始事件
					break; 
					case	FLEX_BTN_PRESS_SHORT_UP: // 短按抬起事件
					break; 
					case	FLEX_BTN_PRESS_LONG_START: // 长按开始事件
					{
						print_debug("FLEX_BTN_PRESS_LONG_START\r\n");
						break;
					} 
					case	FLEX_BTN_PRESS_LONG_UP:// 长按抬起事件
					break; 
					case	FLEX_BTN_PRESS_LONG_HOLD: // 长按保持事件
					{
						print_debug("KEY_LOCK_WATER\r\n");
						break;
					}
					case	FLEX_BTN_PRESS_LONG_HOLD_UP:// 长按保持的抬起事件
					break; 
					default:break;
				}
				break;
			}
			case SW_HOT_EN://加热开关
			{
				switch(btn->event)
				{
					case  FLEX_BTN_PRESS_DOWN:// 按下事件
					
#if(QIANG_YING_DEVICE == 1)
						if((HAL_GetTickMs()>5000) || (powerDownSave.work_mode == 1))//在测试模式
						{
							if((powerDownSave.energy_set & 0x02) == 0x02)powerDownSave.energy_set &= (~0x02);
							else	powerDownSave.energy_set |= 0x02;
							gLoabal.eepromCnt = 1;//保存
						}
#endif						
						break;
					
					case	FLEX_BTN_PRESS_CLICK: // 单击事件
					break;  
					case	FLEX_BTN_PRESS_DOUBLE_CLICK: // 双击事件
					break; 
					case	FLEX_BTN_PRESS_REPEAT_CLICK:  // 连击事件，使用 flex_button_t 中的 click_cnt 断定连击次数
					break;
					case	FLEX_BTN_PRESS_SHORT_START: // 短按开始事件
					break; 
					case	FLEX_BTN_PRESS_SHORT_UP: // 短按抬起事件
#if(QIANG_YING_DEVICE == 1)
						if((powerDownSave.energy_set & 0x02) == 0x00) powerDownSave.energy_set |= 0x02;
						else powerDownSave.energy_set &= (~0x02);
						gLoabal.eepromCnt = 1;//保存
#endif				
					break; 
					case	FLEX_BTN_PRESS_LONG_START: // 长按开始事件
					break; 
					case	FLEX_BTN_PRESS_LONG_UP:// 长按抬起事件
#if(QIANG_YING_DEVICE == 1)
						if((powerDownSave.energy_set & 0x02) == 0x00) powerDownSave.energy_set |= 0x02;
						else powerDownSave.energy_set &= (~0x02);
						gLoabal.eepromCnt = 1;//保存
#endif	
					break; 
					case	FLEX_BTN_PRESS_LONG_HOLD: // 长按保持事件
					{
						print_debug("SW_HOT_EN\r\n");
						break;
					}
					case	FLEX_BTN_PRESS_LONG_HOLD_UP:// 长按保持的抬起事件
#if(QIANG_YING_DEVICE == 1)
						if((powerDownSave.energy_set & 0x02) == 0x00) powerDownSave.energy_set |= 0x02;
						else powerDownSave.energy_set &= (~0x02);
						gLoabal.eepromCnt = 1;//保存
#endif	
					break; 
					default:break;
				}
				break;
			}
			case SW_COOL_EN://制冷开关
			{
				switch(btn->event)
				{
					case  FLEX_BTN_PRESS_DOWN :// 按下事件
					{
#if(QIANG_YING_DEVICE == 1)		
						if((HAL_GetTickMs()>5000) || (powerDownSave.work_mode == 1))//在测试模式
						{
							if((powerDownSave.energy_set & 0x01) == 0x01)powerDownSave.energy_set &= (~0x01);
							else	powerDownSave.energy_set |= 0x01;
							gLoabal.eepromCnt = 1;//保存
						}
#endif
						break;
					}
					case	FLEX_BTN_PRESS_CLICK: // 单击事件
					break;  
					case	FLEX_BTN_PRESS_DOUBLE_CLICK: // 双击事件
					break; 
					case	FLEX_BTN_PRESS_REPEAT_CLICK:  // 连击事件，使用 flex_button_t 中的 click_cnt 断定连击次数
					break;
					case	FLEX_BTN_PRESS_SHORT_START: // 短按开始事件
					break; 
					case	FLEX_BTN_PRESS_SHORT_UP: // 短按抬起事件
#if(QIANG_YING_DEVICE == 1)						
						if((powerDownSave.energy_set & 0x01) == 0x00)powerDownSave.energy_set |= 0x01;
						else powerDownSave.energy_set &= (~0x01);
						gLoabal.eepromCnt = 1;//保存
#endif						
					break; 
					case	FLEX_BTN_PRESS_LONG_START: // 长按开始事件
					break; 
					case	FLEX_BTN_PRESS_LONG_UP:// 长按抬起事件
#if(QIANG_YING_DEVICE == 1)						
						if((powerDownSave.energy_set & 0x01) == 0x00)powerDownSave.energy_set |= 0x01;
						else powerDownSave.energy_set &= (~0x01);
						gLoabal.eepromCnt = 1;//保存
#endif							
					break; 
					case	FLEX_BTN_PRESS_LONG_HOLD: // 长按保持事件
					{
						print_debug("SW_HOT_EN\r\n");
						break;
					}
					case	FLEX_BTN_PRESS_LONG_HOLD_UP:// 长按保持的抬起事件
#if(QIANG_YING_DEVICE == 1)						
						if((powerDownSave.energy_set & 0x01) == 0x00)powerDownSave.energy_set |= 0x01;
						else powerDownSave.energy_set &= (~0x01);
						gLoabal.eepromCnt = 1;//保存
#endif	
					break; 
					default:break;
				}
				break;
			}
			default:
				break;
		}
//		
//	}
}

static uint8_t (*func_read[USER_BUTTON_MAX])(void *arg) = 
{
	common_btn_read,
	common_btn_read,
	common_btn_read,
	common_btn_read,
	common_btn_read,
	common_btn_read,
	common_btn_read,
};

static void (*func_callback[USER_BUTTON_MAX])(void *arg) = 
{
	common_btn_evt_cb,
	common_btn_evt_cb,
	common_btn_evt_cb,
	common_btn_evt_cb,
	common_btn_evt_cb,
	common_btn_evt_cb,
	common_btn_evt_cb,

};

void key_button_init(void)
{
    int i;
    
    memset(&user_button[0], 0x0, sizeof(user_button));

    for (i = 0; i < USER_BUTTON_MAX; i ++)
    {
		user_button[i].id = i;
		user_button[i].usr_button_read = func_read[i];
		user_button[i].cb = func_callback[i];
		user_button[i].pressed_logic_level = 1;
		user_button[i].short_press_start_tick = FLEX_MS_TO_SCAN_CNT(50);
		user_button[i].long_press_start_tick 	= FLEX_MS_TO_SCAN_CNT(3000);
		user_button[i].long_hold_start_tick 	= FLEX_MS_TO_SCAN_CNT(19000);
		
		switch(i)
		{
			case KEY_COOL_WATER://冷水按键
			{
				user_button[i].long_hold_start_tick = FLEX_MS_TO_SCAN_CNT(5000);//5s
				break;
			}
			case KEY_HOT_WATER://热水按键
			{
				user_button[i].long_hold_start_tick = FLEX_MS_TO_SCAN_CNT(5000);//5s
				break;
			}
	
			default:

				break;
		}
        flex_button_register(&user_button[i]);
    }
	

}

